package activitys;

import interfaces.PostSeleccion;

import java.util.ArrayList;
import java.util.List;

import utils.BaseAsync;
import utils.PreferencesHelper;
import utils.SelectorCaracteristicas;
import utils.json.JSONParser;

import com.example.pasajero.R;

import controladores.ControladorPasajeros;

import entidades.Caracteristica;
import entidades.Favorito;
import entidades.PuntoGeografico;
import entidades.Viaje;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class SolicitarActivity extends BaseActivityCerrarSesion implements PostSeleccion
{

	private Boolean localizo = false;

	private LocationManager locManager;
	private LocationListener locListener;

	private double latitud;
	private double longitud;

	private Location loc;
	

	private TextView estado;
	private EditText campoDireccion;
	private EditText campoDireccionFin;
	private EditText campoComentario;

	private Favorito favoritoInicio;
	private Favorito favoritoFin;
	
	private List<Caracteristica> caracteristicas;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_solicitar);

		localizo = false;

		estado = (TextView) findViewById(R.id.textView_estado);
		estado.setText("Localizando...");

		campoDireccion = (EditText) findViewById(R.id.campoDireccion);
		campoDireccionFin = (EditText) findViewById(R.id.campoDireccionFin);
		campoComentario = (EditText) findViewById(R.id.campoComentarioSolicitud);
		
		favoritoInicio = null;
		favoritoFin = null;
		
		caracteristicas = new ArrayList<Caracteristica>();

	}

	private void mostrarAvisoGpsDeshabilitado()
	{
		AlertDialog alertDialog = new AlertDialog.Builder(this).create();
		alertDialog.setTitle("Error");
		alertDialog.setMessage("GPS no habilitado.");
		alertDialog.show();
		estado = (TextView) findViewById(R.id.textView_estado);
		estado.setText("No Localizando");
	}

	/*
	 * cuando mi hijo termina recibo lo que manda
	 */
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		super.onActivityResult(requestCode, resultCode, data);

		if (requestCode == 0 && data != null)
		{
			Bundle b = data.getExtras();
			favoritoInicio = new JSONParser<Favorito>(Favorito.class)
					.fromJson(b.getString("clave"));
			campoDireccion.setText("" + favoritoInicio.getNombre());
			campoDireccion.setEnabled(false);
		}
		if (requestCode == 1 && data != null)
		{
			Bundle b = data.getExtras();
			favoritoFin = new JSONParser<Favorito>(Favorito.class).fromJson(b
					.getString("clave"));
			campoDireccionFin.setText("" + favoritoFin.getNombre());
			campoDireccionFin.setEnabled(false);
		}
	}

	public void favoritosInicio(View v)
	{
		Intent i = new Intent(this, FavoritosActivity.class);
		this.startActivityForResult(i, 0);
	}

	public void favoritosFin(View v)
	{
		Intent i = new Intent(this, FavoritosActivity.class);
		this.startActivityForResult(i, 1);
	}

	@Override
	public void onResume()
	{
		super.onResume(); // Always call the superclass method first

		comenzarLocalizacion();

		// locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
		// 30000, 0, locListener);
	}

	@Override
	public void onPause()
	{
		super.onPause(); // Always call the superclass method first
		if (locManager != null)
			locManager.removeUpdates(locListener);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.solicitar, menu);
		return true;
	}

	private void comenzarLocalizacion()
	{
		// Obtenemos una referencia al LocationManager
		locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

		// Obtenemos la última posición conocida
		loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

		// Mostramos la última posición conocida
		mostrarPosicion(loc);

		// Nos registramos para recibir actualizaciones de la posición
		locListener = new LocationListener()
		{
			public void onLocationChanged(Location location)
			{
				mostrarPosicion(location);
			}

			public void onProviderDisabled(String provider)
			{
				mostrarAvisoGpsDeshabilitado();
			}

			public void onProviderEnabled(String provider)
			{
				estado.setText("Localizando...");
				loc = locManager
						.getLastKnownLocation(LocationManager.GPS_PROVIDER);
				mostrarPosicion(loc);
			}

			public void onStatusChanged(String provider, int status,
					Bundle extras)
			{
				Log.i("LOG", "Provider Status: " + status);
			}
		};

		try
		{
			locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
					30000, 0, locListener);
		} catch (Exception e)
		{

		}
	}

	private void mostrarPosicion(Location loc)
	{
		if (loc != null)
		{
			estado.setText("localizado");
			PuntoGeografico punto = new PuntoGeografico(loc.getLatitude(),
					loc.getLongitude());

			this.latitud = punto.getLatitud();
			this.longitud = punto.getLongitud();

			Log.i("LOG",
					String.valueOf(loc.getLatitude() + " - "
							+ String.valueOf(loc.getLongitude())));
			localizo = true;
		} else
		{

			localizo = false;
		}
	}

	public void solicitar(View v)
	{
		AlertDialog.Builder alert = new AlertDialog.Builder(this);
		
		PuntoGeografico punto;
		PuntoGeografico puntoFin;

		if (favoritoInicio == null)
			punto = getPunto();
		else
			punto = favoritoInicio.getPunto();
		
		if (favoritoFin == null)
			puntoFin = getPuntoFin();
		else
			puntoFin = favoritoFin.getPunto();

		if (punto == null)
		{
			alert.setTitle("Primero lo primero!!!");
			alert.setMessage("Ingrese dirección o encieda GPS");
			alert.setPositiveButton("Aceptar",
					new DialogInterface.OnClickListener()
					{
						public void onClick(DialogInterface dialog, int whichButton)
						{
							
						}
					});
			alert.show();
		}
		else
			new SolicitarViaje(punto,puntoFin).execute();
	}
	public void limpiarInicio(View v)
	{
		campoDireccion.setText("");
		favoritoInicio = null;
		campoDireccion.setEnabled(true);		
	}
	
	public void limpiarFin(View v)
	{
		campoDireccionFin.setText("");
		favoritoFin = null;
		campoDireccionFin.setEnabled(true);
	}

	private PuntoGeografico getPunto()
	{
		String direccion = campoDireccion.getText().toString();

		if (direccion == null || direccion.equals(""))
		{
			if (!localizo)
				return null;

			return new PuntoGeografico(latitud, longitud);
		} else
		{
			// if (!checkDireccion(direccion))
			// return null;
			PuntoGeografico punto = new PuntoGeografico(direccion);
			punto.setDireccion(direccion);
			return punto;
		}
	}

	private PuntoGeografico getPuntoFin()
	{
		String direccion = campoDireccionFin.getText().toString();

		if (direccion == null || direccion.equals(""))
			return null;
		else
			return new PuntoGeografico(direccion);
	}
	
	public void seleccionarCaracteristicas (View view)
	{
		new SelectorCaracteristicas(SolicitarActivity.this, this).execute();
	}

//	private boolean checkDireccion(String direccion)
//	{
//		String split[] = direccion.split(" ");
//
//		if (split.length < 2)
//			return false;
//
//		try
//		{
//			for (int i = 0; i < split.length; i++)
//			{
//				try
//				{
//					Integer.parseInt(split[i]);
//					return false;
//				} catch (NumberFormatException ex2)
//				{
//
//				}
//			}
//
//			Integer.parseInt(split[split.length - 1]);
//
//			return true;
//		} catch (NumberFormatException ex)
//		{
//			return false;
//		}
//	}

	private class SolicitarViaje extends BaseAsync
	{
		private boolean seguir;
		private PuntoGeografico punto;
		private PuntoGeografico puntoFin;

		public SolicitarViaje(PuntoGeografico punto, PuntoGeografico puntoFin)
		{
			super(SolicitarActivity.this, "Solicitando...");
			this.punto = punto;
			this.puntoFin = puntoFin;
		}

		@Override
		protected Void doInBackground(Void... arg0)
		{
			Viaje viaje = new ControladorPasajeros().solicitar(
					new PreferencesHelper(getApplicationContext()).leerID(),
					punto, puntoFin, campoComentario.getText().toString(), caracteristicas);

			seguir = viaje != null;

			return null;
		}

		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);

			if (seguir)
			{
				Intent i = new Intent(SolicitarActivity.this,
						ViajeActivity.class);
				startActivity(i);
				finish();
			} else
				Toast.makeText(SolicitarActivity.this, "Fallo la solicitud",
						Toast.LENGTH_SHORT).show();
		}
	}

	@Override
	public void postSeleccion(List<Caracteristica> seleccion)
	{
		if (seleccion != null)
			caracteristicas = seleccion;
	}
}
